package com.macro.mall.portal.util;

import org.springframework.beans.BeanUtils;
import org.springframework.util.Assert;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 通用对象转换工具类
 */
public class GenericConverter {

    /**
     * 基础对象转换（浅拷贝）
     * @param source 源对象
     * @param targetClass 目标类
     * @param <S> 源类型
     * @param <T> 目标类型
     * @return 转换后的对象
     */
    public static <S, T> T convert(S source, Class<T> targetClass) {
        Assert.notNull(source, "Source must not be null");
        Assert.notNull(targetClass, "Target class must not be null");

        try {
            T target = targetClass.newInstance();
            BeanUtils.copyProperties(source, target);
            return target;
        } catch (InstantiationException | IllegalAccessException e) {
            throw new RuntimeException("Failed to create instance of " + targetClass.getName(), e);
        }
    }

    /**
     * 带自定义转换逻辑的对象转换
     * @param source 源对象
     * @param targetClass 目标类
     * @param customizer 自定义转换逻辑
     * @param <S> 源类型
     * @param <T> 目标类型
     * @return 转换后的对象
     */
    public static <S, T> T convert(S source, Class<T> targetClass, Function<S, T> customizer) {
        Assert.notNull(source, "Source must not be null");
        Assert.notNull(targetClass, "Target class must not be null");
        Assert.notNull(customizer, "Customizer must not be null");

        return customizer.apply(source);
    }

    /**
     * 批量转换（浅拷贝）
     * @param sources 源对象列表
     * @param targetClass 目标类
     * @param <S> 源类型
     * @param <T> 目标类型
     * @return 转换后的对象列表
     */
    public static <S, T> List<T> convertList(List<S> sources, Class<T> targetClass) {
        Assert.notNull(sources, "Sources must not be null");
        Assert.notNull(targetClass, "Target class must not be null");

        return sources.stream()
                .map(source -> convert(source, targetClass))
                .collect(Collectors.toList());
    }

    /**
     * 批量转换（带自定义逻辑）
     * @param sources 源对象列表
     * @param targetClass 目标类
     * @param customizer 自定义转换逻辑
     * @param <S> 源类型
     * @param <T> 目标类型
     * @return 转换后的对象列表
     */
    public static <S, T> List<T> convertList(List<S> sources, Class<T> targetClass, Function<S, T> customizer) {
        Assert.notNull(sources, "Sources must not be null");
        Assert.notNull(targetClass, "Target class must not be null");
        Assert.notNull(customizer, "Customizer must not be null");

        return sources.stream()
                .map(source -> convert(source, targetClass, customizer))
                .collect(Collectors.toList());
    }

    /**
     * 特殊字段转换：BigDecimal 转 Integer（向下取整）
     * @param value BigDecimal 值
     * @return 转换后的整数值
     */
    public static Integer bigDecimalToInteger(BigDecimal value) {
        return value != null ? value.setScale(0, RoundingMode.DOWN).intValue() : null;
    }

    /**
     * 特殊字段转换：BigDecimal 转 Integer（带默认值）
     * @param value BigDecimal 值
     * @param defaultValue 默认值
     * @return 转换后的整数值
     */
    public static Integer bigDecimalToInteger(BigDecimal value, int defaultValue) {
        return value != null ? value.setScale(0, RoundingMode.DOWN).intValue() : defaultValue;
    }

    /**
     * 特殊字段转换：Double 转 Integer（向下取整）
     * @param value Double 值
     * @return 转换后的整数值
     */
    public static Integer doubleToInteger(Double value) {
        return value != null ? (int) Math.floor(value) : null;
    }
}